﻿/******************************************************
 * @文件名         ETListObj.cs
 * @文件描述       滤波坐标类
 * @作者           dingyl
 * @版本           0.1
 * @创建日期       2014-04-30
 ******************************************************/
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Diagnostics;

namespace etcd
{
    class CCoordinateFilter : CollectionBase
    {
        private int m_nMMaxLength;       //链表最大长度
        public CCoordinateFilter()
        {
            m_nMMaxLength = 10;
        }

        public CCoordinateFilter(int nMaxLength)
        {
            m_nMMaxLength = nMaxLength;
        }
        /*******************************************************************************
       * @函数名        FilterData
       * @参数1[in]     point   需要过滤处理的数据点
       * @作用          滤波坐标
       * @返回值        无
       *****************************************************************************/
        public void FilterData(ref ETListObj point)
        {
            ETFilterListObj ptTemp = new ETFilterListObj();
            ETFilterListObj ptProc = new ETFilterListObj();
            AdjustFilterData(ref point);
            ptTemp[0] = point[0];
            ptTemp[1] = point[1];
            ptTemp[2] = point[2];
            long lXMax = point[0];
            long lYMax = point[1];
            long lZMax = point[2];

            long lXMin = point[0];
            long lYMin = point[1];
            long lZMin = point[2];

            long lXSum = 0;
            long lYSum = 0;
            long lZSum = 0;           
            do
            {
                if (this.Count > m_nMMaxLength)
                {
                    List.RemoveAt(0); 
                }
                List.Add(ptTemp);

                int nLength = this.Count;
                if (nLength < 3)
                {
                    break;             //只有两组数据不用进行过滤计算
                }

                foreach (CCoordinateFilter objList in List)
                {
                    ptProc = (ETFilterListObj)objList;
                    lXSum += ptProc[0];
                    lYSum += ptProc[1];
                    lZSum += ptProc[2];

                    lXMax = lXMax < ptProc[0] ? ptProc[0] : lXMax;
                    lXMin = lXMin > ptProc[0] ? ptProc[0] : lXMin;

                    lYMax = lYMax < ptProc[1] ? ptProc[1] : lYMax;
                    lYMin = lYMin > ptProc[1] ? ptProc[1] : lYMin;

                    lZMax = lZMax < ptProc[2] ? ptProc[2] : lZMax;
                    lZMin = lZMin > ptProc[2] ? ptProc[2] : lZMin;
                }
                point[0] = (int)((lXSum - lXMax - lXMin) / (long)(nLength - 2));
                point[1] = (int)((lYSum - lYMax - lYMin) / (long)(nLength - 2));
                point[2] = (int)((lZSum - lZMax - lZMin) / (long)(nLength - 2));
            } while (false);
        }

        /*******************************************************************************
       * @函数名        AdjustFilterData
       * @参数1[in]     point   需要调整点坐标
       * @作用          将坐标调整到0-359之间
       * @返回值        无
       *****************************************************************************/
        private void AdjustFilterData(ref ETListObj point)
        {
            //进行滤波前限幅运算
            point[0] = point[0] >= 360 ? 359 : point[0];
            point[0] = point[0] <= -360 ? -359 : point[0];

            point[1] = point[1] >= 360 ? 359 : point[1];
            point[1] = point[1] <= -360 ? -359 : point[1];

            point[2] = point[2] >= 360 ? 359 : point[2];
            point[2] = point[2] <= -360 ? -359 : point[2];
        }

        /*******************************************************************************
        * @函数名        RemoveAll
        * @作用          清空链表
        * @返回值        无
        *****************************************************************************/
        public void RemoveAll()
        {
            List.Clear();
        }
    }//CCoordinateFilter  end
}
